/**
 * TypeScript的一些拓展
 */
export namespace Util {

    /**
     * 【函数防抖】
     * 推迟函数执行，防止系列事件被快速重复调用
     * @param func 
     * @param delay 默认250毫秒
     * @returns
     */
    export function debounce(func: Function, delay: number = 250) {
        let timeout;
        return function () {
            const context = this;
            const args = arguments;
            clearTimeout(timeout);
            timeout = setTimeout(() => func.apply(context, args), delay);
        };
    }

    /**
     * 【函数节流】
     * 设定执行频率，防止系列事件被快速重复调用
     * @param func 
     * @param delay 默认250毫秒
     * @param endCheck true: 防止节流期间遗漏调用；false: 不关心节流期间的调用
     * @returns 
     */
    export function throttle(func: Function, delay: number = 250, endCheck: boolean = true) {
        let wait = false;
        let dirty = false;

        const closureFunc = function () {
            if (wait) {
                dirty = true;
                return;
            }

            wait = true;
            const context = this;
            const args = arguments;
            func.apply(context, args);
            dirty = false;

            setTimeout(() => {
                wait = false;
                if (dirty && endCheck) {
                    closureFunc.apply(context, args);
                }
            }, delay);
        }
        return closureFunc;
    }

    /**
     * 字符串替换
     * 替换标识： {&i} , i>=0
     * @param msg string 原文
     * @param value (string | number)[] 待替换内容
     * @returns 
     */
    export function stringFormat(msg: string, ...value: (string | number)[]): string {
        const len: number = value != null ? value.length : 0;
        let str = msg;
        for (let idx = 0; idx < len; idx++) {
            const val: string = String(value[idx]);
            const pattern = new RegExp(`{&${idx}}`, "g");
            str = str.replace(pattern, val);
        }
        return str;
    }

}